#include <iostream>
#include <signal.h>
#include <string>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <stdlib.h>
#include <functional>
#include <vector>

using namespace std;

typedef function<void ()> func;
vector<func> callbacks;

uint64_t count = 0;

void showCount()
{
    cout << "final count : " << count << endl;
}

void showLog()
{
    cout << "这是个日志功能" << endl;
}

void logUser()
{
    if (fork() == 0)
    {
        execl("/usr/bin/who", "who", nullptr);
        exit(1);
    }
    wait(nullptr);
}

void catchSig(int signum)
{
    // cout << "进程捕捉到了一个信号正在处理中 : " << signum << " Pid : " << getpid() << endl;
    for (auto& f : callbacks)
    {
        f();
    }
    alarm(1);
}

static void Usage(string proc)
{
    cout << "Usage:\r\n\t" << proc << "signumber processid" << endl;
}

void handler(int signum)
{
    sleep(1);
    cout << "获得一个信号 : " << signum << endl;
    exit(1);
}

//.mykill 2 pid
int main(int argc, char* argv[])
{
    // 验证1s内，一共进行多少次++；
    signal(SIGALRM, catchSig);
    
    alarm(1);
    callbacks.push_back(showCount);
    callbacks.push_back(showLog);
    callbacks.push_back(logUser);
    while (true) count++;

    
    // int count = 0;
    // while (true)
    // {
    //     cout << "count : " << count++ << endl;
    // }



    // abort();//通常用来终止进程

    // raise(8);//自己给自己发指定的信号

    // if (argc != 3)
    // {
    //     Usage(argv[0]);
    //     exit(1);
    // }

    // int signumber = atoi(argv[1]);
    // int procid = atoi(argv[2]);

    // kill(procid, signumber);


    // signal(SIGINT, catchSig);//特定信号的处理动作，一般只有一个
    // //signal函数，仅仅是修改进程对特定信号的后续处理动作，不是直接调用对应的处理动作
    // //如果后续没有任何SIGINT信号产生，catchSig永远也不会被调用
    // signal(SIGQUIT, catchSig);//ctrl+\

    // while (true)
    // {
    //     cout << "我是一个进程，我正在运行..., pid : " << getpid() << endl;
    //     sleep(1);
    // }

    // pid_t id = fork();
    // if (id == 0)
    // {
    //     int a = 100;
    //     a /= 100;
    //     exit(0);
    // }
    // int status = 0;
    // waitpid(id, &status, 0);
    // cout << "父进程 : " << getpid() << " 子进程 : " << id << " exit sig : "\
    //  << (status & 0x7F) << " is core : " << ((status >> 7) & 1) << endl;

    return 0;
}